#ifndef SC_TICK_H
#define SC_TICK_H

#include "common.h"

/**
 * stdint.h是c99中引进的一个标准C库的文件，定义了几种扩展的整数类型和宏。
 * C语言现代方法中的P506的介绍
 *  */ 
#include <stdint.h>

// 64位有符号整数 自定义时间戳类型,精确到微秒
typedef int64_t sc_tick;

/**
 * printf函数的一部分，用于和int64_t类型的整数一起使用。
 * PRIi64在inttypes.h头文件中定义，这个文件通常被包含在使用64位整数和格式化输入/输出的程序中。
 * PRIi64是一个宏定义，它的值依赖于特定的系统和编译器，可能是"l"（对于长整数），"ll"（对于更长的整数），或其他类似的字符串
 * 
 * 暂未找到使用的地方
 */
#define PRItick PRIi64

// Windows平台用到
#define SC_TICK_FREQ 1000000 // microsecond // microsecond(微秒; 百万分之一秒;)

// To be adapted if SC_TICK_FREQ changes

// 注意宏定义中的参数是要多加一层括号的

// 将微秒数转换为纳秒数
// \param tick 微秒数
// \return 转换成的纳秒数
#define SC_TICK_TO_NS(tick) ((tick) * 1000)

// 将微秒数转换为微秒数，基本用不上
// \param tick 微秒数
// \return 转换成的微秒数
#define SC_TICK_TO_US(tick) (tick)

// 将微秒数转换为毫秒数
// \param tick 微秒数
// \return 转换成的毫秒数
#define SC_TICK_TO_MS(tick) ((tick) / 1000)

// 将微秒数转换为秒数
// \param tick 微秒数
// \return 转换成的秒数
#define SC_TICK_TO_SEC(tick) ((tick) / 1000000)

// 1微秒=1000纳秒
// 将纳秒数转换为微秒数，基本用不上
// \param tick 纳秒数
// \return 转换成的微秒数
#define SC_TICK_FROM_NS(ns) ((ns) / 1000)

// 将微秒数转换为微秒数，基本用不上
// \param tick 微秒数
// \return 转换成的微秒数
#define SC_TICK_FROM_US(us) (us)

/*
获取毫秒对应的纳秒
@param ms 毫秒数
@return 纳秒数
*/
#define SC_TICK_FROM_MS(ms) ((ms) * 1000)

// 1秒=1000毫秒 1毫秒=1000微秒
// \param sec 秒数
// \return 秒数转换成的微秒数
#define SC_TICK_FROM_SEC(sec) ((sec) * 1000000)

/** 
主机开机到当前的微秒数，不受修改系统时间的影响。目前看到只用在随机数生成时
@return 主机开机到当前的微秒数
*/
sc_tick
sc_tick_now(void);

#endif
